home *** CD-ROM | disk | FTP | other *** search
- #include "xmath.h"
- #include <float.h>
- #define twopi 6.28318530717958647693
- #define twobypi .63661977236758134308
-
- double _Sin(x, qoff)
- double x;
- unsigned int qoff;
- { /* sin(x) or cos(x) */
- double g, g2;
- long quad;
- int big;
-
- if ((big = HUGE_RAD < x) || x < -HUGE_RAD) {
- g = x * (1 / twopi);
- x -= (big ?
- (g + 1 / DBL_EPSILON) - 1 / DBL_EPSILON :
- 1 / DBL_EPSILON - (1 / DBL_EPSILON - g)) *
- twopi;
- /* Rounding mode doesn't matter */
- }
- g = quad = x * twobypi + (0 < x ? .5 : -.5);
- #if LDBL_DIG > DBL_DIG && 0
- g = x - g * 1.57079632679489661923L;
- #else
- g = (x - g * (3294198. / 2097152.)) - g *
- 3.139164786504813217e-7;
- #endif
- g2 = g * g;
- if ((qoff += (unsigned long) quad & 3) & 1)
- g = 1 + g2 * (-.499999999999999994 + g2 *
- (.041666666666666452 + g2 *
- (-.001388888888886110 + g2 *
- (.000024801587283884 + g2 *
- (-.000000275573130985 + g2 *
- (.000000002087558246 - g2 *
- .000000000011353383))))));
- else
- g += g * g2 * (-.16666666666666616 + g2 *
- (.00833333333332036 + g2 * (-.00019841269828653
- + g2 * (.0000027557313377252
- + g2 * (-.000000025050717097 + g2 *
- .00000000015894743)))));
- return qoff & 2? -g: g;
- }
- WRAP_EOF
-